-- SPDX-License-Identifier: GPL-3.0-or-later

local CardItem = require "packages.hearthstone.battlegrounds.core.card.carditem"

--- 炉石传说随从类
--- 
--- 随从是可以放置到场上战斗的单位
--- 继承自CardItem，添加战斗属性和种族系统
---
---@class Hearthstone.Minion : Hearthstone.CardItem
---@field public atk integer @ 攻击力
---@field public hp integer @ 生命值
---@field public maxHp integer @ 最大生命值
---@field public race string @ 种族（野兽/恶魔/机械/鱼人/元素/龙/海盗/图腾/全部/无）
---@field public tags string[] @ 特殊标签（嘲讽/圣盾/剧毒/风怒/冲锋/潜行等）
---@field public tavern_level integer? @ 酒馆等级(1-6)，仅酒馆战旗模式使用
---@field public tavern_tier integer? @ 酒馆品质（金色=3星），仅酒馆战旗模式使用

local Minion = CardItem:subclass("Hearthstone.Minion")

---@alias MinionRace string
Minion.Beast = "beast"           -- 野兽
Minion.Demon = "demon"           -- 恶魔
Minion.Mech = "mech"             -- 机械
Minion.Murloc = "murloc"         -- 鱼人
Minion.Elemental = "elemental"   -- 元素
Minion.Dragon = "dragon"         -- 龙
Minion.Pirate = "pirate"         -- 海盗
Minion.Totem = "totem"           -- 图腾
Minion.All = "all"               -- 全部
Minion.None = "none"             -- 无种族

---@alias MinionTag string
Minion.Taunt = "taunt"           -- 嘲讽
Minion.DivineShield = "divine_shield" -- 圣盾
Minion.Poisonous = "poisonous"   -- 剧毒
Minion.Windfury = "windfury"     -- 风怒
Minion.Charge = "charge"         -- 冲锋
Minion.Stealth = "stealth"       -- 潜行
Minion.Reborn = "reborn"         -- 复生
Minion.Rush = "rush"             -- 突袭
Minion.Lifesteal = "lifesteal"   -- 吸血
Minion.Deathrattle = "deathrattle" -- 亡语
Minion.Battlecry = "battlecry"   -- 战吼

--- 构造函数
---@param name string @ 随从名称
---@param cost integer @ 法力值消耗
---@param atk integer @ 攻击力
---@param hp integer @ 生命值
---@param race string @ 种族
---@param rarity string @ 稀有度
---@param card_class string @ 职业
---@param card_set string @ 卡牌集
---@param tavern_level integer? @ 酒馆等级（酒馆战旗模式）
function Minion:initialize(name, cost, atk, hp, race, rarity, card_class, card_set, tavern_level)
  CardItem.initialize(self, name, cost, CardItem.TypeMinion, rarity, card_class, card_set)
  
  self.atk = atk or 0
  self.hp = hp or 1
  self.maxHp = self.hp
  self.race = race or Minion.None
  self.tags = {}
  
  -- 酒馆战旗专用字段
  self.tavern_level = tavern_level
  self.tavern_tier = nil
end

function Minion:__tostring()
  return "<Minion " .. self.name .. " (" .. self.atk .. "/" .. self.hp .. ")>"
end

--- 克隆随从
---@param new_name string? @ 新名称
---@return Minion
function Minion:clone(new_name)
  local cloned = self.class:new(
    new_name or self.name,
    self.cost,
    self.atk,
    self.hp,
    self.race,
    self.rarity,
    self.card_class,
    self.card_set,
    self.tavern_level
  )
  
  -- 复制技能
  cloned.skills = {}
  for _, skill in ipairs(self.skills) do
    table.insert(cloned.skills, skill)
  end
  
  -- 复制标签
  cloned.tags = {}
  for _, tag in ipairs(self.tags) do
    table.insert(cloned.tags, tag)
  end
  
  return cloned
end

--- 添加标签
---@param tag string @ 标签名称
function Minion:addTag(tag)
  if not table.contains(self.tags, tag) then
    table.insert(self.tags, tag)
  end
end

--- 移除标签
---@param tag string @ 标签名称
function Minion:removeTag(tag)
  for i, t in ipairs(self.tags) do
    if t == tag then
      table.remove(self.tags, i)
      break
    end
  end
end

--- 检查是否有指定标签
---@param tag string @ 标签名称
---@return boolean
function Minion:hasTag(tag)
  return table.contains(self.tags, tag)
end

--- 检查是否为指定种族
---@param race string @ 种族
---@return boolean
function Minion:isRace(race)
  return self.race == race
end

--- 设置攻击力
---@param atk integer @ 攻击力
function Minion:setAttack(atk)
  self.atk = atk
end

--- 设置生命值
---@param hp integer @ 生命值
function Minion:setHealth(hp)
  self.hp = hp
  if hp > self.maxHp then
    self.maxHp = hp
  end
end

--- 增加攻击力
---@param amount integer @ 增加数量
function Minion:addAttack(amount)
  self.atk = self.atk + amount
end

--- 增加生命值
---@param amount integer @ 增加数量
function Minion:addHealth(amount)
  self.hp = self.hp + amount
  self.maxHp = self.maxHp + amount
end

--- 受到伤害
---@param damage integer @ 伤害值
---@return integer @ 实际受到的伤害
function Minion:takeDamage(damage)
  local actual_damage = math.min(damage, self.hp)
  self.hp = self.hp - actual_damage
  return actual_damage
end

--- 治疗
---@param heal integer @ 治疗值
---@return integer @ 实际治疗量
function Minion:heal(heal)
  local actual_heal = math.min(heal, self.maxHp - self.hp)
  self.hp = self.hp + actual_heal
  return actual_heal
end

--- 检查是否死亡
---@return boolean
function Minion:isDead()
  return self.hp <= 0
end

--- 检查是否满血
---@return boolean
function Minion:isFullHealth()
  return self.hp >= self.maxHp
end

--- 获取随从属性（兼容旧接口）
---@param key string @ 属性名
---@return any
function Minion:getProperty(key)
  return self[key] or 0
end

--- 获取随从描述（包含属性信息）
---@param lang string? @ 语言
---@return string
function Minion:getDescription(lang)
  local desc = CardItem.getDescription(self, lang)
  local stats = self.atk .. "/" .. self.hp
  if self.race ~= Minion.None then
    stats = stats .. " " .. self.race
  end
  return desc .. " (" .. stats .. ")"
end


return Minion